﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using FB.DataAccess.DataInf;
using FB.Utilities;

namespace FB.DataAccess
{
    public class TagDAO : ITagDAO
    {
        private static FBDATA dataContext;

        private IRepository<Tag> repository;
        public TagDAO()
        {
            dataContext = new FBDATA();
            repository = new RepositoryDAO<Tag>(dataContext);
        }

        public IEnumerable<Tag> GetAllTag()
        {
            return repository.GetQuery().OrderBy(aobj => aobj.ID);
        }
        public Tag GetTagByID(Guid id)
        {
            return repository.Find(obj => obj.ID == id).SingleOrDefault();
        }
        public Tag GetLastRecord()
        {
            return dataContext.Tags.OrderByDescending(obj => obj.ID).FirstOrDefault();
        }

        public bool UpdateTag(Tag inTag)
        {
            if (inTag == null) return false;
            Tag upTag = repository.First(sobj => sobj.ID == inTag.ID);
            if (upTag == null) return false;
            upTag.Name = inTag.Name;
            return repository.SaveChanges() > 0;
        }
        public ReturnValue<bool> InsertTag(Tag inTag)
        {
            if (inTag == null) return new ReturnValue<bool>(false, "Input data null");
            if (IsTagExist(inTag.Name)) return new ReturnValue<bool>(false, "Tag already exist");
            repository.Add(inTag);
            return new ReturnValue<bool>(repository.SaveChanges() > 0, "");
        }

        public ReturnValue<bool> DelTag(Guid id)
        {
            ReturnValue<bool> ret = new ReturnValue<bool>(false, "");
            try
            {
                Tag objDel = repository.First(obj => obj.ID == id);
                ret = DelTag(objDel);
            }
            catch (Exception ex)
            {
                ret.RetValue = false;
                ret.Msg = "Dữ liệu đã được sử dung trong chương trình - không thể xóa !";
            }
            return ret;
        }


        public ReturnValue<bool> DelTag(Tag inTag)
        {
            ReturnValue<bool> ret = new ReturnValue<bool>(false, "");
            if (inTag == null)
            {
                ret.Msg = "input null";
                return ret;
            }
            try
            {
                repository.Delete(inTag);
                ret.RetValue = repository.SaveChanges() > 0;
            }
            catch (System.Exception ex)
            {
                ret.RetValue = false;
                ret.Msg = "Dữ liệu đã được sử dung trong chương trình - không thể xóa !";
            }
            return ret;
        }

        public bool IsTagExist(string tagName)
        {
            return repository.Exist(tag => tag.Name.ToLower() == tagName.ToLower());
        }


        internal List<View_VideoTag> GetTagOfVideo(Guid videoID)
        {
            var result = (from v in dataContext.View_VideoTag
                          where v.IDVideo == videoID
                          orderby (v.TagName)
                          select v);
            return result.ToList(); ;
        }

        public Guid? InsertAndReturnID(string tagName)
        {
            Tag NewTag = new Tag();
            NewTag.Name = tagName;
            NewTag.ID = Guid.NewGuid();
            InsertTag(NewTag);
            
            Tag ReturnTag = GetTagByName(tagName);
            if (ReturnTag != null)
            {
                return ReturnTag.ID;
            }
            return null;
        }

        private Tag GetTagByName(string tagName)
        {
            return repository.Find(obj => obj.Name.ToLower() == tagName.ToLower()).SingleOrDefault();
        }

        public List<Tag> GetTagByVideoYoutubeID(string videoYoutubeID)
        {
            List<View_VideoTag> MessResult = (from m in dataContext.View_VideoTag
                    where m.YoutubeID == videoYoutubeID
                    select m).ToList();
            List<Tag> Result = new List<Tag>();
            foreach (View_VideoTag item in MessResult)
            {
                Result.Add(new Tag(item));
            }
            return Result;
        }

        public List<Tag> SearchTag(string keyword, int limit)
        {
            return dataContext.sp_FB_FindTag(keyword, limit).ToList();

        }
    }
}
